package controller;

import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import properties.MyTradeProps;

import beans.UserBean;

import controller.action.Action;

/**
 * Erstellt am 11.07.2013
 * @author Luca Christen
 */
public class MyFrontController extends HttpServlet {

	private static final long   serialVersionUID = 1L;
	private static final String PACKAGE_ACTION   = "controller.action.";

	public void doGet(HttpServletRequest request, HttpServletResponse response) {
        doService(request, response);
	}
	
	public void doPost(HttpServletRequest request, HttpServletResponse response) {
		doService(request, response); 
	}
	
	public void doService(HttpServletRequest request, HttpServletResponse response) {
		response.setContentType("text/html");
		
		//TODO Seitenfluss via externe Datei konfigurieren
		//TODO Fehlerseite zeigen, falls Seite nicht existiert
		//TODO Aktualisieren, Vorwaerts und Zurueck handeln
		
		RequestDispatcher rd = getServletContext().getNamedDispatcher("jsp");
		
		if (!request.getPathInfo().endsWith(".jsp")) {
			HttpSession s    = request.getSession(true);
			String      view = "login";
			Action 		a;
			
			cleanSession(s);
			
			//pruefen, ob User eingeloggt ist
			if (s.getAttribute("user") == null) {
				a = createActionObject(generateFullQualifiedClassName("/login"));
			} else {
				a = createActionObject(generateFullQualifiedClassName(request.getPathInfo()));
			}
			
			//wenn eingeloggt keine gueltige URL eingegeben wurde, ist a == null
			//so wird auf die Homepage weitergeleitet
			if (a != null) {
				view = a.execute(request, response);
			} else {
				view = getHomepage((UserBean)s.getAttribute("user"));
			}
			

			rd = request.getRequestDispatcher(view + ".jsp");
		}
		
		try {
			rd.forward(request, response);
		} catch (ServletException | IOException e) {
			e.printStackTrace();
		}
	}
	
	private void cleanSession(HttpSession s) {
		//Fehlermeldung zuruecksetzen
		s.setAttribute("meldung", null);
		//Inputwerte zuruecksetzen
		s.setAttribute("input", null);
		//Suchergebnisse zuruecksetzen
		s.setAttribute("search", null);
	}

	private String generateFullQualifiedClassName(String uri) {
		return PACKAGE_ACTION + Character.toUpperCase(uri.charAt(1)) + uri.substring(2) + "Action";		
	}
	
	private Action createActionObject(String fullQualifiedClassName) {		
		try {
			Class<?>  c = Class.forName(fullQualifiedClassName); 
			Action    a = (Action)c.newInstance();
			return a;
		} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
			e.printStackTrace();
		}
		
		return null;
	}
	
	private String getHomepage(UserBean ub) {
		int rolle = ub.getRolleFk();
		if (rolle == Integer.valueOf(MyTradeProps.getPropertyText("user.id.aktienhaendler"))) {
			return MyTradeProps.getPropertyText("user.homepage.aktienhaendler");
		} else {
			return "administration";
		}
	}
}
